package pe.com.cotelasa.scp.dominio.servicio.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;

import javax.inject.Inject;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.dao.IDAOProveedor;
import pe.com.cotelasa.scp.dominio.common.ESTADO_REGISTRO;
import pe.com.cotelasa.scp.dominio.common.ESTADO_RESULTADO;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioProveedor;
import pe.com.cotelasa.scp.entidad.Proveedor;
import pe.com.cotelasa.scp.to.ProveedorTO;

@SuppressWarnings("serial")
@Service
public class ServicioProveedorImpl implements IServicioProveedor, Serializable {

    private static Logger logger = Logger.getLogger(ServicioProveedorImpl.class);
    @Inject
    private IDAOProveedor daoProveedor;

    @Override
    public Collection<Proveedor> listarProveedorActivos() throws ServiceException {
        try {
            return daoProveedor.listarActivos(Proveedor.class);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Proveedor conseguirProveedorPorId(Integer idProveedor)
            throws ServiceException {
        try {
            return daoProveedor.obtenerEntidadPorId(Proveedor.class,
                    idProveedor);
        } catch (DAOException ex) {
            ex.printStackTrace();
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<Proveedor> listarTodosProveedores()
            throws ServiceException {
        try {
            return daoProveedor.listarTodos(Proveedor.class);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public ResultadoServicio guardarProveedor(Proveedor proveedor)
            throws ServiceException {
        ResultadoServicio resultadoServicio = new ResultadoServicio(
                ESTADO_RESULTADO.EXITOSO);
        try {

            proveedor.setEstadoRegistro(ESTADO_REGISTRO.ACTIVO.getValor());
            daoProveedor.insertar(proveedor);

        } catch (DAOException ex) {
            resultadoServicio.setEstadoResultado(ESTADO_RESULTADO.FALLIDO);
            resultadoServicio
                    .setMensaje("Ocurrio un problema al tratar de guardar el proveedor.");
            throw new ServiceException(ex.getMessage(), ex);
        }
        return resultadoServicio;
    }

    @Override
    public void eliminarProveedor(Proveedor proveedor) throws ServiceException {
        proveedor.setEstadoRegistro(ESTADO_REGISTRO.INACTIVO.getValor());
        try {
            daoProveedor.actualizar(proveedor);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public ResultadoServicio actualizarProveedor(Proveedor proveedor)
            throws ServiceException {
        ResultadoServicio resultadoServicio = new ResultadoServicio(
                ESTADO_RESULTADO.EXITOSO);
        try {
            daoProveedor.actualizar(proveedor);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
        return resultadoServicio;
    }

    @Override
    public Collection<Proveedor> listarProveedorPorFiltro(Proveedor proveedor)
            throws ServiceException {
        Map<String, Object> parametros = new HashMap<String, Object>();
        parametros.put("ruc", proveedor.getRuc());
        parametros.put("nombreComercial", proveedor.getNombreComercial());
        parametros.put("razonSocial", proveedor.getRazonSocial());
        parametros.put("estadoRegistro", "" + ESTADO_REGISTRO.ACTIVO.getValor());
        try {
            return daoProveedor.obtenerColeccionEntidadPorFiltros(
                    Proveedor.class, parametros);
        } catch (DAOException e) {
            throw new ServiceException(e.getMessage(), e);
        }
    }

    @Override
    public void registrarProveedor(Proveedor proveedor) throws ServiceException {
        try {
            if (proveedor.getId() == null) {
                proveedor.setUsrCreacion("jporras");
                proveedor.setFecCreacion(new Date());
                logger.info("guardar proveedor: " + proveedor);
                daoProveedor.insertar(proveedor);
            } else {
                proveedor.setUsrModificacion("jporras");
                proveedor.setFecModificacion(new Date());
                logger.info("guardar proveedor: " + proveedor);
                daoProveedor.actualizar(proveedor);
            }

        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Proveedor conseguirProveedorConUbigeo(Integer idProveedor)
            throws ServiceException {
        try {
            return daoProveedor.obtenerEntidadConUbigeo(idProveedor);
        } catch (DAOException ex) {
            java.util.logging.Logger.getLogger(
                    ServicioProveedorImpl.class.getName()).log(Level.SEVERE,
                    null, ex);
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Collection<ProveedorTO> listarProveedorPorTipo()
            throws ServiceException {
        try {
            return daoProveedor.listarProveedorPorTipo();
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public Proveedor obtenerProveedorPorRazonSocial(String nomProveedor)
            throws ServiceException {
        try {
            return daoProveedor.obtenerProveedorPorRazonSocial(nomProveedor);
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public boolean validarRuc(String ruc) throws ServiceException {
        try {
            if (daoProveedor.validarRuc(ruc) == null) {
                return true;
            } else {
                return false;
            }
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }

    @Override
    public boolean validarRazonSocial(String razonSocial)
            throws ServiceException {
        try {
            if (daoProveedor.validarRazonSocial(razonSocial) == null) {
                return true;
            } else {
                return false;
            }
        } catch (DAOException ex) {
            throw new ServiceException(ex.getMessage(), ex);
        }
    }
}
